package com.EWS.util;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

// T 表示泛化：不制定某个具体的类；
public abstract  class DbUtil<T> {
   // 使用静态代码块加载数据库驱动
  static{
       try{
           // 1.通过反射加载数据库驱动
           // 版本是8.0以上的要加cj
           Class.forName("com.mysql.cj.jdbc.Driver");
       }catch(ClassNotFoundException ce){
           ce.printStackTrace();
       }
   }

    /**
     *
     * 2.编写方法获取数据库连接
     *
     */
  public  static Connection getCon(){
      Connection connection = null;
      try{
          String url = "jdbc:mysql://localhost:3307/EnglishWords?autoReconnection=true&useSSL=false";
          String userName="root";
          String passWord = "wsh6742693";
          connection = DriverManager.getConnection(url,userName,passWord);
      }catch(SQLException ce){
          ce.printStackTrace();
      }
      return  connection;
  }

    /***
     *
     *  3.1.创建会话对象statement：执行增加  删除 修改操作
     *
     */
   public static int stmExcuteSQL(String sql){
       Integer result = null;
       try{
           Connection conn = getCon();
           Statement smt = conn.createStatement();
           result = smt.executeUpdate(sql);
           if(result>0){
               System.out.println("OK");
           }else{
               System.out.println("失败！");
           }
           closeDb(conn,smt,null,null);
       }catch(SQLException ce){
         ce.printStackTrace();
       }
      return result;
   }


    /***
     *
     *  3.2 创建会话对象prepareStatement：执行增加  删除 修改操作
     *  ...obj表示 1个或多个参数的obj 数组
     */
    public static int prePareStmetExcute(String sql,Object ...obj){
        Integer result = null;
        try{
            Connection conn = getCon();
            PreparedStatement psmt = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                psmt.setObject((i+1),obj[i]);
            }
            result =  psmt.executeUpdate();
            if(result>0){
                System.out.println("成功！");
            }else{
                System.out.println("失败！");
            }
            closeDb(conn,null,psmt,null);
        }catch(SQLException ce){
            ce.printStackTrace();
        }
        return result;
    }

    /**
     *
     * 关闭流
     */
    public  static  void closeDb(Connection conn,Statement stm,PreparedStatement psmt,ResultSet rs){
        try{
            if(rs != null){
                rs.close();
            }
            if(psmt != null){
                psmt.close();
            }
            if(stm != null){
                stm.close();
            }
            if(conn != null){
                conn.close();
            }
        }catch(SQLException ce){
            ce.printStackTrace();
        }
    }

     /**
      *
      * 查询
      * ...obj 表示object类中一个多多个参数的数组
      */
   public List<T> getDataList(String sql,Object...obj){
       List<T> dataList = new ArrayList<T>();
       try{
           Connection conn = getCon();
           PreparedStatement psmt = conn.prepareStatement(sql);
           for (int i = 0; i < obj.length; i++) {
               psmt.setObject((i+1),obj[i]);
           }
           ResultSet rs = psmt.executeQuery();
           while(rs.next()){
              T t = getEntity(rs);
               dataList.add(t);
           }
           closeDb(conn,null,psmt,rs);
       }catch(SQLException ce){
           ce.printStackTrace();
       }
      return  dataList;
   }
     /**
      * 数据库表中每一行数据转为javaBean每一个对象
      */
   public abstract  T getEntity(ResultSet rs);

}
